//
//  WmcTableViewEmpty.swift
//  YPWatermarkCamera
//
//  Created by yupao_ios_macmini06 on 2022/10/24.
//

import Foundation
import UIKit

// MARK: - [WmcTableViewEmptyDelegate]

protocol WmcTableViewEmptyDelegate: AnyObject {
    /// 空视图数据源
    func tableViewEmpty() -> Int
    /// 指定空视图代理
    func tableViewEmptyView(_ tableView: UITableView) -> WmcBaseEmptyView?
}

extension WmcTableViewEmptyDelegate {
    /// 默认空视图（如果没设置的话）
    /// - Parameter tableView: tableView description
    /// - Returns: description
    func tableViewEmptyView(_ tableView: UITableView) -> WmcBaseView? {
        return WmcDefaultEmptyView(frame: .zero)
    }
}

// MARK: - [TableViewAssociateKeys]

struct TableViewAssociateKeys {
    /// 空视图代理
    static var WmcEmptyDelegate: WmcTableViewEmptyDelegate?
    /// 空视图
    static var WmcEmptyView: WmcBaseView?
}

extension UITableView {
    func wmcReloadData() {
        self.reloadData()
        showEmpty()
    }

    /// 代理
    weak var emptyDelegate: WmcTableViewEmptyDelegate? {
        set {
            objc_setAssociatedObject(self, &TableViewAssociateKeys.WmcEmptyDelegate, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
        get {
            return objc_getAssociatedObject(self, &TableViewAssociateKeys.WmcEmptyDelegate) as? WmcTableViewEmptyDelegate
        }
    }

    /// 空视图
    var emptyView: WmcBaseEmptyView? {
        set {
            objc_setAssociatedObject(self, &TableViewAssociateKeys.WmcEmptyView, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
        get {
            return objc_getAssociatedObject(self, &TableViewAssociateKeys.WmcEmptyView) as? WmcBaseEmptyView
        }
    }

    /// 展示空 视图
    /// - Returns: description
    func showEmpty() {
        let isEmpty = (self.emptyDelegate?.tableViewEmpty() ?? 0) > 0 ? false : true
        if isEmpty {
            // 显示
            self.subviews.forEach { subV in
                if subV.isKind(of: WmcBaseEmptyView.classForCoder()) {
                    subV.removeFromSuperview()
                }
            }
            guard let empty = self.emptyDelegate?.tableViewEmptyView(self) else {
                return
            }
            addSubview(empty)
        } else {
            // 移除
            self.subviews.forEach { subV in
                if subV.isKind(of: WmcBaseEmptyView.classForCoder()) {
                    subV.removeFromSuperview()
                }
            }
        }
    }
}
